using System;
using System.Linq;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Input;
using Avalonia.Media;
using mas.ViewModels;
using System.Runtime.InteropServices;

namespace mas.Views;

public partial class ImageDetailWindow : Window
{
    // 添加：拖动状态跟踪变量
    private bool _isDragging;
    private Point _startPoint;
    private double _initialOffsetX;
    private double _initialOffsetY;
    
    // 允许_viewModel为null（默认构造函数中未初始化）
    private readonly ImageDetailViewModel? _viewModel;  // 添加?使字段可空

    // 带ViewModel参数的构造函数
    public ImageDetailWindow(ImageDetailViewModel viewModel)
    {
        InitializeComponent();
        _viewModel = viewModel;
        DataContext = _viewModel;
        // 检查是否在Linux上运行，如果是则使用纯黑色背景而不是亚克力效果
        if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux))
        {
            // 在Linux上使用纯黑色背景
            Background = new SolidColorBrush(Colors.Black);
        }
        else
        {
            // 在Windows和macOS上保留亚克力模糊效果
            TransparencyLevelHint = [WindowTransparencyLevel.AcrylicBlur];
            Background = Brushes.Transparent;
        }
    }
    // 鼠标滚轮缩放处理（
    private void Image_PointerWheelChanged(object sender, PointerWheelEventArgs e)
    {
        // 通过sender获取Image控件，再获取TransformGroup
        if (sender is Image image && image.RenderTransform is TransformGroup transformGroup)
        {
            // 从TransformGroup中获取缩放变换
            var scaleTransform = transformGroup.Children.OfType<ScaleTransform>().FirstOrDefault();
            if (scaleTransform == null) return;

            // 计算缩放增量（滚轮上滚放大，下滚缩小）
            var scaleDelta = e.Delta.Y > 0 ? 0.1 : -0.1;
            
            // 应用缩放（限制最小缩放为0.1倍）
            scaleTransform.ScaleX = Math.Max(0.1, scaleTransform.ScaleX + scaleDelta);
            scaleTransform.ScaleY = Math.Max(0.1, scaleTransform.ScaleY + scaleDelta);
        }
    }
    // 鼠标按下（开始拖动）
    private void Image_PointerPressed(object sender, PointerPressedEventArgs e)
    {
        if (sender is Image image && image.RenderTransform is TransformGroup transformGroup &&
            e.GetCurrentPoint(this).Properties.IsLeftButtonPressed)  // 仅响应左键
        {
            // 获取平移变换
            var translateTransform = transformGroup.Children.OfType<TranslateTransform>().FirstOrDefault();
            if (translateTransform == null) return;

            // 记录初始状态
            _isDragging = true;
            _startPoint = e.GetCurrentPoint(this).Position;
            _initialOffsetX = translateTransform.X;
            _initialOffsetY = translateTransform.Y;

            // 修复：Avalonia 中使用 Pointer.Capture 捕获指针
            e.Pointer.Capture(image); 
        }
    }
    // 鼠标移动（拖动中）
    private void Image_PointerMoved(object sender, PointerEventArgs e)
    {
        if (!_isDragging || sender is not Image image || image.RenderTransform is not TransformGroup transformGroup)
            return;

        // 获取平移变换
        var translateTransform = transformGroup.Children.OfType<TranslateTransform>().FirstOrDefault();
        if (translateTransform == null) return;

        // 计算鼠标移动增量
        var currentPoint = e.GetCurrentPoint(this).Position;
        var deltaX = currentPoint.X - _startPoint.X;
        var deltaY = currentPoint.Y - _startPoint.Y;

        // 更新平移位置
        translateTransform.X = _initialOffsetX + deltaX;
        translateTransform.Y = _initialOffsetY + deltaY;
    }
    // 鼠标释放（结束拖动）
    private void Image_PointerReleased(object sender, PointerReleasedEventArgs e)
    {
        _isDragging = false;
        if (sender is Image image)
        {
            // Avalonia 中使用 Pointer.Capture(null) 释放指针
            e.Pointer.Capture(null);  
        }
    }

    // 窗口关闭时释放ViewModel资源（添加null检查）
    protected override void OnClosed(EventArgs e)
    {
        base.OnClosed(e);
        _viewModel?.Dispose();  // 使用?避免null引用异常
    }
}
